Ааа, ну тогда смотри
не_кликабельность Сларка делается так
а - его морфят в юнит без модельки
б - ему дают москитов и отбирают (что бы на него нельзя было кликнуть, но можно было выделить)
в - все события "атакован" приводятся к действию "стоп", если это Сларк
г - аура регена игнорирует то что Сларка видят
у тебя на пути стоит пункт Б, т.к. что бы умные люди не заменяли себе пустую модельку (пункт А) на нормальную и не могли на неё в итоге тыкать... Так что в итоге - ты можешь её заменить, но тыкнуть всё равно не сможешь... шах и мат
можно либо заменять юнита, либо химичить с тексттагами(то есть сделать систему имен игровых обьектов на тексттагах), ещё есть функция для смены имени игрока
код
native SetPlayerName takes player whichPlayer, string name returns nothing
предметам имена изменять нельзя
способности могут быть с таким же успехом удалены, добавлены
этим
native UnitAddAbility takes unit whichUnit, integer abilityId returns boolean
native UnitRemoveAbility takes unit whichUnit, integer abilityId returns boolean
подробнее насчет предметов, думаю можно похимичить с кастом велью, устанавливать его
native S2I takes string s returns integer
native I2S takes integer i returns string
конвертировать, потом выводить строки на экран через
это
native DisplayTextToPlayer takes player toPlayer, real x, real y, string message returns nothing
с таким же успехом можно использовать хеш-таблицы, для аттача описания к чему-либо.
Ещё есть вариант, с описанием предметов и способностей в квестах.
В общем без гемора, и написания левых систем никак)
100500 раз уже спрашивалось. Заменяй кириллические символы на похожую латиницу. Если лень исправлять блокнотом - могу скинуть war3rainbow, там есть функция автозамены на латин.
что значит обращаться?
к библиотеке как к объекту обращаться нельзя ибо библиотека это не объект а лишь область кода
обращаться можно лишь к не приватным функциям и переменных из библиотеки
советую перечитать что такое библиотека либо научиться правильно формулировать свои вопросы
а вообще можно вспомнить кампанию людей - там есть миссия по защите Стратхольма, или как та деревня называлась - и там есть таймер, который нормально сохраняется
Он вроде как спрашивает, не остается ли что-либо в памяти игры или на карте. По-моему ничего не остается, удаляя юнита таким образом мы его навсегда выбрасываем.
Друга зачем? Нинада, так толку не будет...
Просто используешь Inject main (vjass) или Define (Cjass) чтобы убрать 1 только строчку из main
//***************************************************************************
//*
//* Map Configuration
//*
//***************************************************************************
//***************************************************************************
//*
//* Main Initialization
//*
//***************************************************************************
//===========================================================================
function main takes nothing returns nothing
call SetCameraBounds(- 3328.0 + GetCameraMargin(CAMERA_MARGIN_LEFT), - 3584.0 + GetCameraMargin(CAMERA_MARGIN_BOTTOM), 3328.0 - GetCameraMargin(CAMERA_MARGIN_RIGHT), 3072.0 - GetCameraMargin(CAMERA_MARGIN_TOP), - 3328.0 + GetCameraMargin(CAMERA_MARGIN_LEFT), 3072.0 - GetCameraMargin(CAMERA_MARGIN_TOP), 3328.0 - GetCameraMargin(CAMERA_MARGIN_RIGHT), - 3584.0 + GetCameraMargin(CAMERA_MARGIN_BOTTOM))
call SetDayNightModels("Environment\\DNC\\DNCLordaeron\\DNCLordaeronTerrain\\DNCLordaeronTerrain.mdl", "Environment\\DNC\\DNCLordaeron\\DNCLordaeronUnit\\DNCLordaeronUnit.mdl")
call NewSoundEnvironment("Default")
call SetAmbientDaySound("SunkenRuinsDay")
call SetAmbientNightSound("SunkenRuinsNight")
call SetMapMusic("Music", true, 0)
call InitBlizzard() // вот и все, удалим и не будет бж объектов.
call InitGlobals()
call InitCustomTriggers()
call RunInitializationTriggers()
endfunction
Совсем забыл, функция main генерируется при сохранении карты в редакторе
Без cjass или vjass придется выколупывать war3map.j (код карты) файл из карты и править ручками в блокнотике, геморойно до безобразия, за то ненужен c\vjass и его знания.
создаём юнита
даём юниту таймер
и проверяем что с ним стало
офигиваем от того что выяснили это сами
и не задаём тупых вопросов на 4 дня пропал и уже 69 тупых вопросов
Лимит операций, обычно это беда настигает заядлых гуишников.
На jass обычно нету таких проблем.
Создайте таймер с периодом .00 сек и запускайте им функции инициализации триггеров.
функция типа InitTrig_Имя триггера - это функция инициализации триггера, она вызывается из функции InitCustomTriggers, но если этих вызовов очень много то функция упирается в лимит операций и поток завершается так и не создав все триггеры.
silence_AZ,
Вот вам пример, идите разбирайте его и читайте все статьи, что есть.
function UnitAddEffect takes unit u, real x, real y returns nothing
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Undead\\AnimateDead\\AnimateDeadTarget.mdl", x, y))
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl", GetUnitX(u), GetUnitY(u)))
endfunction
function Action takes nothing returns nothing
local unit u = GetOrderedUnit()
local real x = GetOrderPointX()
local real y = GetOrderPointY()
call UnitAddEffect(u, x, y)
endfunction
function InitTrig_Effect takes nothing returns nothing
local trigger t = CreateTrigger()
local integer i = 0
loop
call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER, null)
set i = i + 1
exitwhen i == 16
endloop
call TriggerAddAction( t, function Action )
endfunction
Создайте триггер "Effect", конвертируйте в текст, удалите все что там есть, копирните и вставьте мое, запускайте карту и побегайте юнитами.
То что я написал можно и нужно оптимизировать, но так как вам нужен пример создания пользовательский функций, то я сделал именно так.
Вот на всякий случай оптимизированный вариант.
SetUnitPosition довольно тяжелая операци, юзайте SetUnitX\Y в конце полета юзай SetUnitPosition для того чтобы юнит не залетел в непроходимое место.
Фильтр просто ужас, ну кто так фильтры делает?
Проверка на 'Aloc', я в ужасе на кой черт проверять на дамми если GropEnumUnitsInRange\Rect не выделяет москитов, тока EnumOfPlayer может пикнуть москитов, остальное не пикает их, на то они и москиты...
Вот как выглядит нормальный фильтр без локалок и прочего
function EnemyFilter takes nothing returns boolean
set bj_lastFilterUnit = GetFilterUnit( )
return GetUnitState( bj_lastFilterUnit, UNIT_STATE_LIFE ) > 0.405 and IsUnitEnemy( bj_lastFilterUnit, bj_groupEnumOwningPlayer ) and not( IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MAGIC_IMMUNE ) or IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MECHANICAL ) or IsUnitInvulnerable( bj_lastFilterUnit ) )
endfunction
UnitDamageTargetEx - красиво но нафиг ненужно обводить в отдельную функцию с тучей аргументов + жутко неудобно, 100500 аргументов у функции и фиг знает за что какой от вечает, прямо так UnitDamageTarget, без отдельной функции.
Туча констант, тоже хорошо тока длят наработок, на деле ставь конкретные значения или юзай Difine vjass'a.
Ещё есть вариант - тревога это реакция нейтральных монстров на то, что недалеко от них появилось здание (когда начинаешь строить здание, и тут из леса прибегают нейтралы, ломают, и убегают обратно).
первая проверка - мб эта функция делает так что данный нейтрал игнорирует то что рядом с ним появится здание, и он в итоге не побежит его атаковать
вторая проверка - возможно функция делает само здание игнорируемым для этих нейтралов, т.е. конкретно на него не будут сбегаться ближайшие нейтралы
Sargaraser, эт проблема сиденья с телефона -'фиг попадешь по нужной ссылке
А по теме поиск творит чудеса , за 3 минуты поиска нашел 10 тем с таким вопросом и в каждой есть решение
The Dude, это несерьезно. Все вопросы описаны в большом количестве статей здесь, на нашем сайте - xgm.guru/p/wc3/articles. То, что перечисляешь не верх мастерства WE, а базовые знания. Материалов предостаточно. Успехов в обучении.
Да сделай проще. Создай многоуровневую способность-пустышку. и когда отдаешь приказ атаковать в область, давай ему эту способность и с помощью неё отслеживай, какую область атаковать.
Например,
способность уровень 1, значит атаковать должен 1 область.
Уровень 2 - 2 область и т. д.
Не вижу смысла усложнять жизнь с хеш-таблицей.
Надеюсь понятно?) Отдал приказ, присвоил способность, после каста жди пару сек и в зависимости от уровня способности-пустышки отправляй в ту или иную область.
лень учить джасс но не лень 2 часа тыкаться с гуи
короче тут всё ясно
ответ на вопрос
статей про "правильное гуи" на этом сайте нету
иногда куски с гуи встречаются в статьях про джасс так что можешь прочесть статьи про джасс
но вообще посмотри
наличия триггера на получение урона для каждого юнита
так делать нельзя
это же полный бред
просто добавляем событие к уже существующему триггеру вот и всё
нормального сборщика мусора в варе нет и скорее всего не будет(если близы даже рб поленились убрать то о нормальном gc можно забыть)
так же не стоит забывать что сборщик мусора срабатывает не сразу
если мне не изменяет память то save сохраняет объекты и значения переменных
а при загрузке восстанавливает связи (заносит значения в переменные, регистрирует события и прочее)
так что всякий мусор просто не проходит
а вообще лучше забей на это
в варе есть более серьёзные утечки от которых нельзя избавиться
например руны
+ создание и удаление триггеров вредит намного больше чем пара сотен килобайт памяти
да и вряд ли у тебя за игру будет 50к юнитов
Obelick, эта либо не трогает мультибоарды
она по точкам(location) в основном работает Obelick:
учить ради них джас и переписывать мне настолько лень
если ты нормально знаешь гуи и имеешь базовые знания по использованию гугл переводчика то переписать мультибоард на jass много времени не займёт
кроме того тебе не обязательно переписывать полностью
можно сконвертировать в код и поправить то что вызывает утечки
если ты говоришь об утечках в функции установки значения ячейки мультибоарда то их можно убрать следующим кодом
вставь его в шапку карты (туда где ты ALL.j подключал)
правда после этого автозаполнение строк/столбцов перестанет работать и придётся делать его циклом
"В личном порядке".
Занесена базовая атака героя, учтено, сколько книжек на урон герой "съел", какие способности изучил, какие предметы одел, в идеале - какие баффы какого уровня получил. Хотя скорее всего описание врёт и сделано всё попроще - от главного атрибута или типа того, чтобы примерно равнялось 50% атаки. Если нужен костыль такого заклинания - могу скинуть, но надёжность оставляет желать лучшего. Но в наработке исправно наносится в заклинании урон по величине атаки героя, правда без учета баффов и преметов, только уровня. Farrien:
У меня появилась идея,
Если нужно -могу подогнать системку, ловящую перехват смены приказа, она не блещет точностью, но абузить шансовые эффекты точно не получится.
не стоит использовать ждать
создаём для юнита целочисленную переменную time
1 триггер
Событие
периодическое событие - каждые 0.1 сек.-
Условие
time > 0
Действие
set time = time - 1
если time == 0 то понизить уровень способности "незаметность" для "герой" до 1
2 триггер
Событие
боевая единица - юнит атакован
Условие
Атакующий юнит=герой или Атакованный юнит=герой
Действие
set time=30
боевая единица - повысить уровень способности "незаметность" для "герой" до 2
не забудь закрыть вопрос (для этого выбери лучший ответ)
Вобщем озарение как всегда пришло внезапно - понял что GetSpellAbilityUnit срабатывает на дамми и записывает в массив его, а не цель щита. Просто передвинул махинации с дамми в конец функции Actions. Всё отменно работает. Всем спасибо все свободны
пиши свою систему баффов
это не так сложно как кажется
просто вешай бафы дамикастом/спелбуком а потом удаляй при необходимости Mrachny, как же ты надоел писать всякий бред
ты получаешь удовольствие от того что путаешь других людей?
или ты просто не способен осознать что несёшь полную ерунду?
ClotPh, при наличие 20-30 юнитов под бафом лаги обеспечены
аффтару
делай как писали выше
пикаем всех юнитов(кроме дамми херни) и проверяем наличие бафа и если баф есть даём спел на повышение макс хп одновременно запоминая юнита
когда баф потерян убираем повышение макс хп
Smart - работает, но с атакой - нет. Юнит по-прежнему подбегает к врагу и начинает его бить. А должен был уже на пол пути остановиться :/
Всё зависит от событие.
Smart работает, когда событие с точка обьект.
Область поражения будет не округлой а эпилептической, смещенной на некоторое расстояние вперед, чтобы добится эффекта как от волны силы, чтобы поражать врагов позади цели атаки.
Да сделай проще. Создай многоуровневую способность-пустышку. и когда отдаешь приказ атаковать в область, давай ему эту способность и с помощью неё отслеживай, какую область атаковать.
Например,
способность уровень 1, значит атаковать должен 1 область.
Уровень 2 - 2 область и т. д.
Не вижу смысла усложнять жизнь с хеш-таблицей.
Надеюсь понятно?) Отдал приказ, присвоил способность, после каста жди пару сек и в зависимости от уровня способности-пустышки отправляй в ту или иную область.
Вот тут ты можешь скачать программу, которая конвертирует изображения в формат blp, а так же делает много другого полезного, связанного с изображениями для варика: xgm.ru/p/wc3/blplab
там находится граница рендеринга 3d сцены, расширить эту границу можно сменив acpect ratio (естественно, просто картой это не сделать, добро пожаловать в storm.dll)
а) Создай 2 переменные-массива по типу "боевая единица" (массив - чтобы для каждого игрока, мы ведь за мультиплеер трем, прально?), назови типа MyChampion и MyChampionDummy.
б) подготовь невидимого героя-пустышку с нужной тебе иконкой, убери ману, если у чемпиона ее нет. Убери ему радиус обзора, убери галочки типа "отмечать на мини-карте" - остальные - опционально.
В дальнейшем мы будем синхронизировать пустышку и реального чемпиона, создавая видимость одной боевой единицы.
Итак, наш первый триггер:
в) Отследи первое появление чемпиона, когда это случится - создай для игрока героя-пустышку. Соответственно сделай MyChampion [number of (Owner of trained unit)]= last trained unit, следующей строчкой создай того самого героя-пустышку для (owner of trained unit) и сделай MyChampionDummy = last created unit. Теперь мы прочно связали этих чуваков. Этот же триггер запускает остальные.
г) Отслеживание здоровья. Сделай изначально выключенный цикличный триггер, там, каждые 0.3 секунды. Триггер запускается пунктом в). Каждые 0.3 секунды меняй здоровье героя (чья икона висит, надо чтобы она соответствовала, прально?) в % на здоровье самого чемпиона.
д) пропищи событие, мол, если выбирает игрок своего героя (кликая на иконку) выбирается чемпион
е) убивай героя вместе с чемпионом
ж) отключай триггеры с проверкой и выбором, пока чемпион мертв
з) не забывай обновлять переменную чемпиона с каждым новым чемпионом.
Странно, попробуй тогда еще нестандартные кланы и фиксированные параметры игрока. Рамка в синематике (леттербокс режиме) должна быть та же, что и игровой интерфейс.
Нашёл систему, где звук передаётся в таймер, который истекает через 0 секунд. В результате один и тот же звук может проигрываться несколько раз без всяких проблем. В инетике пишут мол это такой баг движка.
Darknessay, я имел ввиду изначальное расстояние между объектами.
Вот нарисовал схематично.
Обозначим расстояние которое прошёл 1 юнит за х. Красная линия это путь который прошел юнит 2 до встречи. Двигались они одинаковое время, значит составим равенство(s1 и s2 это скорости) и немного преобразуем.
Вод мою систему такой расчет не подойдет. GF RaiseD:
Это не в одну строку посчитать
function getTargetOffset takes unit Caster, unit Target, real targetSpeed, real missileSpeed returns real
local real x1 = GetUnitX(Caster)
local real x2 = GetUnitX(Target)
local real x3
local real X4 //Координата X точки пересечения
local real y1 = GetUnitY(Caster)
local real y2 = GetUnitY(Target)
local real y3
local realY4 //Координата Y точки пересечения
local real targetSpeed
local real missileSpeed
local real distancex1x2 = Sqrt(Pow(x2-x1,2)+Pow(y2-y1,2))
local real distancex1x3
local real distanceX4Y4
set x3 = GetUnitX(Target)+targetSpeed*distaancex1x2/missileSpeed*Cos(GetUnitFacing(Target))*bj_DEGSTORAD
set y3 = GetUnitY(Target)+targetSpeed*distaancex1x2/missileSpeed*Sin(GetUnitFacing(Target))*bj_DEGSTORAD
set distaancex1x3 = Sqrt(Pow(x3-x1,2)+Pow(y3-y1,2))
set X4 = GetUnitX(Target)+targetSpeed*distancex1x2/missileSpeed*distancex1x3/distancex1x2*Cos(GetUnitFacing(Target))*bj_DEGSTORAD
set Y4 = GetUnitY(Target)+targetSpeed*distancex1x2/missileSpeed*distancex1x3/distancex1x2*Sin(GetUnitFacing(Target))*bj_DEGSTORAD
set Caster = null
set Target = null
set distanceX4Y4 = Sqrt(Pow(X4-x2,2)+PowY4-y2,2)) // Опережение (по отношению к повороту юнита-цели)
return distanceX4Y4
endfunction
Если что - я не проверял. Но должно бы работать.
Если тебе нужен угол с точки x2 на точку x3, определяется он так:
Atan2(y3-y2,x3-x2)*bj_RADTODEG
Убрал синтаксические ошибки, немного "допилил" - не хочет работать.
Всем привет работяги, я сам справился. Проверил: всё работает.
//===============Вспомогательные_функции================
function GetAngleXY takes real x, real y, real xx, real yy returns real
return bj_RADTODEG * Atan2(yy - y, xx - x)
endfunction
function GetDisXY takes real x, real y, real xx, real yy returns real
return SquareRoot((xx-x) * (xx-x) + (yy-y) * (yy-y))
endfunction
function GetPolarX takes real x, real f, real d returns real
return x + Cos(f*0.0174)*d
endfunction
function GetPolarY takes real y, real f, real d returns real
return y + Sin(f*0.0174)*d
endfunction
//=======================Основная часть=======================
function GetTargetOffset takes unit host, unit target, real speedm returns real
local real speedt = GetUnitMoveSpeed(target)
local real x = GetUnitX(host)
local real y = GetUnitY(host)
local real xx = GetUnitX(target)
local real yy = GetUnitY(target)
local real fac = GetUnitFacing(target)
local real dis = GetDisXY(x,y,xx,yy)
local real time = dis/speedm
local real dispost = GetDisXY(xx,yy,GetPolarX(xx,fac,time*speedt),GetPolarY(yy,fac,time*speedt))
local real X = GetPolarX(xx,fac,dispost) //нужные координаты цели
local real Y = GetPolarY(yy,fac,dispost)
return GetAngleXY(x,y,X,Y)//возвращает угол который нужен для корректировки стрельбы
endfunction
Bornikkeny, сделал специально чтобы доказать тебе что ты несёшь бред
даже 2 скрина приложил
думаю закинуть библиотеки сможешь сам (в папку *твой jngp*\AdicHelper\lib)
Хорошо группы реализуешь как альтернативу unit[array]. Я тоже самое получил. nvc123, и всё же твой хук не тот что мне нужен.
Я решил проблему, спасибо что дал идею обрабатывать движение внутри структуры, а не в стеке.
кот
library Hook initializer Init_Hook uses LibMath
globals
mhook ahook[100]
integer ihook = -1
endglobals
struct mhook
unit host = null
unit target = null
real face = 0
real speed = 0
real dis = 0
real dismax = 0
integer chaini = 0
unit chain[50]
real scale = 0
integer move = 1
integer i = 0
static method Create takes unit host, real tx, real ty, real scale returns mhook
local mhook h = mhook.create()
local integer i = GetPlayerId(GetOwningPlayer(host))
local real x = GetUnitX(host)
local real y = GetUnitY(host)
local real f = GetAngleXY(x,y,tx,ty)
set h.host = host
set h.face = f
set h.speed = 600
set h.dismax = 1400
set h.scale = scale
set h.chain[0] = CreateUnit(Player(i),'h007',GetPolarX(GetUnitX(host),f,h.scale/2),GetPolarY(GetUnitY(host),f,h.scale/2),f)
set h.i = i
call UnitAddAbility(h.chain[0],'Amrf')
call UnitAddAbility(h.chain[0],'Amrf')
call SetUnitFlyHeight(h.chain[0],50,0)
call SetUnitPathing(h.chain[0],false)
return h
endmethod
method Start takes nothing returns boolean
if ihook < 1000 then
set ihook = ihook + 1
set ahook[ihook] = this
return true
else
return false
endif
endmethod
method Destroy takes nothing returns nothing
local integer i = 0
loop
exitwhen i > ihook
if ahook[i] == this then
set ahook[i] = ahook[ihook]
set ahook[ihook] = 0
set ihook = ihook - 1
set i = ihook // выход из цикла
endif
set i = i + 1
endloop
set this.target = null
set this.host = null
call this.destroy()
endmethod
method Move takes nothing returns nothing
local integer i1 = 0
local integer l = 0
local real x
local real y
local real xh
local real yh
local real f
if move == 1
set dis = dis + speed*0.025
loop
exitwhen i1 > .chaini
set x = GetUnitX(.chain[i1])
set y = GetUnitY(.chain[i1])
if i1 > 0 then
set f = GetAngleXY(x,y,GetUnitX(.chain[i1-1]),GetUnitY(.chain[i1-1]))
call SetUnitX(.chain[i1],GetPolarX(x,f,.speed*0.025))
call SetUnitY(.chain[i1],GetPolarY(y,f,.speed*0.025))
else
set f = face
call SetUnitX(chain[i1],GetPolarX(x,f,.speed*0.025))
call SetUnitY(chain[i1],GetPolarY(y,f,.speed*0.025))
endif
call SetUnitFacing(chain[i1],f)
set i1 = i1 + 1
endloop
set x = GetUnitX(chain[chaini])
set y = GetUnitY(chain[chaini])
set f = GetAngleXY(GetUnitX(.host),GetUnitY(.host),x,y)
set xh = GetPolarX(GetUnitX(.host),f,.scale/2)
set yh = GetPolarY(GetUnitY(.host),f,.scale/2)
//Create==================
if GetDisXY(xh,yh,x,y) >= .scale/2 then
set chaini = chaini + 1
set chain[chaini] = CreateUnit(Player(.i),'h007',xh,yh,f)
call UnitAddAbility(.chain[.chaini],'Amrf')
call UnitAddAbility(.chain[.chaini],'Amrf')
call SetUnitFlyHeight(.chain[.chaini],50,0)
endif
if dis > dismax then
set move = 0
endif
else
//REVERSE=============
set xh = GetUnitX(host)
set yh = GetUnitY(host)
set chain[chaini+1] = host
loop
exitwhen l > chaini
set x = GetUnitX(chain[l])
set y = GetUnitY(chain[l])
//if chain[chaini] == null then
// set f = GetAngleXY()
//endif
set f = GetAngleXY(x,y,GetUnitX(chain[l+1]),GetUnitY(chain[l+1]))
call SetUnitX(chain[l],GetPolarX(x,f,speed*0.025))
call SetUnitY(chain[l],GetPolarY(y,f,speed*0.025))
call SetUnitFacing(chain[l],f-180)
set l = l + 1
endloop
//Destroy==================
set x = GetUnitX(chain[chaini])
set y = GetUnitY(chain[chaini])
set xh = GetUnitX(host)
set yh = GetUnitY(host)
if GetDisXY(GetUnitX(chain[chaini]),GetUnitY(chain[chaini]),GetUnitX(host),GetUnitY(host)) < 100 then
call RemoveUnit(chain[chaini])
set chain[chaini] = null
set chaini = chaini - 1
if chaini == -1 then
call .Destroy()
endif
endif
endif
endmethod
endstruct
private function Engine takes nothing returns nothing
local integer i = 0
local mhook h
local group g
local unit t
loop
exitwhen i > ihook
if ahook[i] != 0 then
set h = ahook[i]
//--run--//
call h.Move()
else
set ahook[i] = ahook[ihook]
set ahook[ihook] = 0
set ihook = ihook - 1
set i = i - 1
endif
set i = i + 1
endloop
//call DestroyGroup(g)
set g = null
set t = null
endfunction
function Trig_HookC_Bool takes nothing returns boolean
if GetSpellAbilityId() == 'A01D' then //Способность Мясной хук
return true
else
return false
endif
endfunction
function Trig_HookC_Actions takes nothing returns nothing
local mhook h
set h = mhook.Create(GetSpellAbilityUnit(),GetSpellTargetX(),GetSpellTargetY(),110)
call h.Start()
endfunction
function Init_Hook takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddAction( t, function Trig_HookC_Actions )
call TriggerAddCondition(t,function Trig_HookC_Bool)
call TimerStart(CreateTimer(),0.025,true,function Engine)
endfunction
endlibrary
EnergyFrost, пока не оптимизируешь все бж я даже смотреть не буду(мои однобуквенные переменные и то не так сильно вредят зрению как бж)
если думаешь что я прошу их просто удалить то поищи в гугле слово оптимизация
Решения не было найдено! Самый верный способ сделать свою систему улучшений для юнитов, разбивая их на группы по признаку кол-ва грани у кости и кол-во костей, и в зависимости от этого повышать урон
Как вариант, можешь рассмотреть прописывание собственных границ для модели. Сначала высчитай границы модели по ширине и длине с помощью War 3 Model Editor, а саму высоту изменяй, отталкиваясь от подсчетов программы.
Я психанул и прописал во всех анимках без обьекта границы стандартной формы, что мне помогло и со скейлом выделения и с полоской ХП. Но твой совет я уже видел, и даже упомянул сам - бесполезно менять высоту(по крайне мере, в анимке станда или общих границах, а так да).
» WarCraft 3 / Москиты
» WarCraft 3 / Интерфейс
» WarCraft 3 / Описание предметов
» WarCraft 3 / Почему пропали модели?
» WarCraft 3 / Библиотеки
» WarCraft 3 / Вопрос про таймер
» WarCraft 3 / Вопрос о функциях
» WarCraft 3 / Как сделать атаку юнита по области?
» WarCraft 3 / Об утечках
» WarCraft 3 / Лаги из за способности
» WarCraft 3 / Количество ударов
» WarCraft 3 / Аура
» WarCraft 3 / Как отследить атакующего юнита?
» WarCraft 3 / атака
» WarCraft 3 / Png формат
» WarCraft 3 / Интерфейс игрока
» WarCraft 3 / SquareRoot
» WarCraft 3 / Десинхронизация
» WarCraft 3 / Анимки
» WarCraft 3 / как можно убрать стандартных юнитов с редактора?